home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 9
/
FM Towns Free Software Collection 9.iso
/
t_os
/
tool
/
vdgear
/
src
/
file.c
< prev
next >
Wrap
Text File
|
1994-11-16
|
11KB
|
633 lines
/*
* VIDEO・GEAR
* "file.c"
* by Good-Chy
*/
#include "video.h"
char *name_p[256];
char att_p[256];
char sort_p[256];
char data_str[256];
struct find_t c_file;
int file_end, no;
unsigned drive;
FILE *fp_d;
/******************************************************************************
* name
*/
char *ex_name(char *name) /* 拡張子をとる */
{
int i, len;
len = strlen(name);
for (i=0 ; i<len ; i++)
{
if (*(name+i) == '.')
{
*(name+i) = '\0';
break;
}
}
return name;
}
char *cat_name(char *ex) /* フルパスファイル名に拡張子を付ける */
{
char *crrdir = NULL;
crrdir = _getcwd(crrdir,256);
if (strlen(crrdir) > 3) { strcat(crrdir,"\\"); }
strcat(crrdir,key_buff);
if (strcmp(ex,"") != 0)
{ crrdir = strcat(ex_name(crrdir),ex); }
return crrdir;
}
/******************************************************************************
* load
*/
void str_fget(int len)
{
int p;
char c;
p = 0;
do
{
c = getc(fp_d);
data_str[p] = c;
p++;
} while((c != '\0') && (p<len));
}
void data_load_check()
{
char *crrdir;
crrdir = cat_name("");
if (NULL == (fp_d = fopen(crrdir,"rb")))
{
key_flag = 2;
err_window(1,220,217);
return;
}
str_fget(11);
if (strcmp(data_str,"VIDEO_GEAR") != 0)
{
key_flag = 2;
err_window(2,220,217);
fclose(fp_d);
return;
}
fclose(fp_d);
con_win(2);
}
void data_load()
{
int i;
char c,*p;
char *crrdir;
close();
crrdir = cat_name(".VGS");
fp_d = fopen(crrdir,"rb");
setmos(82);
all_clear();
for ( ;; )
{
c = getc(fp_d);
if (feof(fp_d)) { break; }
else
{
str_fget(255);
switch(c)
{
case 1: /* ビデオ画像 */
{
i = data_str[0] -1;
data[i].effect.flag = 1;
data[i].effect.effect = data_str[1]-1;
data[i].effect.spimpose = data_str[2]-1;
break;
}
case 2: /* パソコン画像 */
{
i = data_str[0] -1;
data[i].picture.flag = 1;
data[i].picture.effect = data_str[1]-1;
data[i].picture.x = data_str[2]-1;
data[i].picture.y = data_str[3]-1;
strcpy(data[i].picture.name, data_str+4);
break;
}
case 3: /* CD */
{
i = data_str[0] -1;
data[i].cd.flag = 1;
data[i].cd.track = data_str[1]-1;
data[i].cd.state = data_str[2]-1;
break;
}
case 4: /* 効果音 */
{
i = data_str[0] -1;
data[i].sound.flag = 1;
data[i].sound.vol = data_str[1]-1;
strcpy(data[i].sound.name, data_str+2);
break;
}
case 5: /* ミキシング */
{
i = data_str[0] -1;
data[i].mixing.flag = 1;
data[i].mixing.vol[0] = data_str[1]-1;
data[i].mixing.vol[1] = data_str[2]-1;
data[i].mixing.vol[2] = data_str[3]-1;
break;
}
}
}
}
fclose(fp_d);
EGB_writePage(egb_work,0x81);
crrdir = cat_name(".VGT");
p = tiff_load(crrdir);
put_vram((p+6),0,60,WORD(p+0),60+WORD(p+2));
EGB_writePage(egb_work,0);
free(p);
setmos(81);
close();
step_print();
}
/******************************************************************************
* save
*/
void str_fput()
{
int p;
char c;
p = 0;
do
{
c = data_str[p];
putc(c,fp_d);
p++;
} while(c != '\0');
}
void data_save_check()
{
char *crrdir;
crrdir = cat_name(".VGS");
if (NULL != (fp_d = fopen(crrdir,"rb")))
{
fclose(fp_d);
con_win(3);
}
else
{
con_win(4);
}
}
void data_save()
{
int i;
char *pic;
char *crrdir = NULL;
close();
crrdir = cat_name(".VGS");
if (NULL == (fp_d = fopen(crrdir,"wb")))
{
key_flag = 2;
err_window(3,220,217);
return;
}
setmos(82);
strcpy(data_str,"VIDEO_GEAR");
str_fput();
for (i=0 ; i<48 ; i++)
{
if (data[i].effect.flag == 1) /* ビデオ画像 */
{
data_str[0] = 1;
data_str[1] = i+1;
data_str[2] = data[i].effect.effect+1;
data_str[3] = data[i].effect.spimpose+1;
data_str[4] = '\0';
str_fput();
}
if (data[i].picture.flag == 1) /* パソコン画像 */
{
data_str[0] = 2;
data_str[1] = i+1;
data_str[2] = data[i].picture.effect+1;
data_str[3] = data[i].picture.x+1;
data_str[4] = data[i].picture.y+1;
strcpy(data_str+5,data[i].picture.name);
str_fput();
}
if (data[i].cd.flag == 1) /* CD */
{
data_str[0] = 3;
data_str[1] = i+1;
data_str[2] = data[i].cd.track+1;
data_str[3] = data[i].cd.state+1;
data_str[4] = '\0';
str_fput();
}
if (data[i].sound.flag == 1) /* 効果音 */
{
data_str[0] = 4;
data_str[1] = i+1;
data_str[2] = data[i].sound.vol+1;
strcpy(data_str+3,data[i].sound.name);
str_fput();
}
if (data[i].mixing.flag == 1) /* ミキシング */
{
data_str[0] = 5;
data_str[1] = i+1;
data_str[2] = data[i].mixing.vol[0]+1;
data_str[3] = data[i].mixing.vol[1]+1;
data_str[4] = data[i].mixing.vol[2]+1;
data_str[5] = '\0';
str_fput();
}
}
fclose(fp_d);
EGB_writePage(egb_work,0x81);
pic = get_vram(32,0,60,319,239);
crrdir = cat_name(".VGT");
tiff_save(crrdir,pic, 320,180);
EGB_writePage(egb_work,0);
free(pic);
free(crrdir);
setmos(81);
close();
}
/******************************************************************************
* ファイルセレクタ-
*/
char *sub_name(char *name, char att)
{
static char tmp[14];
int i;
char *p;
p = tmp;
if ((att & 0x10) != 0) /* サブディレクトリ */
{
*(p++) = '<';
while(*name != '\0')
{
*(p++) = *name;
name++;
}
*(p++) = '>';
*(p++) = '\0';
return tmp;
}
for (i=0 ; i<9 ; i++) /* ファイル名 */
{
if (*name == '.' || *name == '\0')
{ *(p++) = ' '; }
else { *(p++) = *name; name++; }
}
if (*name == '.') { name++; }
for (i=0 ; i<3 ; i++) /* 拡張子 */
{
if (*name == '\0')
{ *(p++) = ' '; }
else { *(p++) = *name; name++; }
}
*p = '\0';
return tmp;
}
int ch_dir(char *name)
{
int vx,vy;
setmos(82);
char *crrdir = NULL;
vx = win[active].wx;
vy = win[active].wy;
EGB_paintMode(egb_work,0x22);
box_full(vx+6,vy+26,vx+89,vy+110,4,4,0);
crrdir = _getcwd(crrdir,256);
if (strlen(crrdir) > 3) { strcat(crrdir,"\\"); }
strcat(crrdir,name);
if (_chdir(crrdir) == -1)
{
key_flag = 2;
err_window(4,220,217);
file_end = 0;
setmos(81);
return 1;
}
setmos(81);
free(crrdir);
return 0;
}
void sort(int file_end)
{
int i, counter=0;
for (i=0 ; i<file_end ; i++)
{
if ((att_p[i] & 0x10) != 0)
{
sort_p[counter] = i;
counter++;
}
}
for (i=0 ; i<file_end ; i++)
{
if ((att_p[i] & 0x10) == 0)
{
sort_p[counter] = i;
counter++;
}
}
}
void nameset(int i)
{
if (NULL != (name_p[i] = malloc(13)))
{
strcpy(name_p[i], c_file.name);
att_p[i] = c_file.reserved[21];
}
}
void setdir()
{
setmos(82);
key_buff_clear();
int i = 1;
if (_dos_findfirst("*.*", _A_SUBDIR, &c_file) != 0)
{
file_end = 0;
setmos(81);
return;
}
else
{
nameset(0);
while(_dos_findnext(&c_file) == 0)
{
nameset(i);
i++;
}
}
file_end = i;
sort(file_end);
setmos(81);
}
void dsp_drive()
{
int vx,vy;
char drv[2];
_dos_getdrive(&drive);
drv[0] = 'A'+drive-1 ; drv[1] = '\0';
vx = win[active].wx;
vy = win[active].wy;
EGB_paintMode(egb_work,0x22);
box_full(vx+140,vy+26,vx+161,vy+47,4,4,0);
sprint(drv,vx+140,vy+48,15,0,46,23,0);
}
void dsp_name(int flag)
{
int i = 0, j, k, vx,vy;
vx = win[active].wx;
vy = win[active].wy;
if (file_end > 0)
{
MOS_disp(0);
k = MOS_getControl();
MOS_setControl(k & 0xfffffffe);
EGB_paintMode(egb_work,0x22);
switch(flag)
{
case 0: /* ファイル名を全部表示 */
{
while((i<6) && (i<file_end))
{
j = sort_p[i+no];
box_full(vx+6,i*14+vy+26,vx+89,i*14+vy+39,4,4,0);
sprint(sub_name(name_p[j],att_p[j]),
vx+12,i*14+vy+39,15,8,12,12,0);
i++;
}
break;
}
case 1: /* 上にスクロ-ル */
{
j = sort_p[no];
scroll(vx+6,vy+26,vx+89,vy+110,0,14);
box_full(vx+6,vy+26,vx+89,vy+39,4,4,0);
sprint(sub_name(name_p[j],att_p[j]),
vx+12,vy+39,15,8,12,12,0);
break;
}
case 2: /* 下にスクロ-ル */
{
j = sort_p[no+5];
scroll(vx+6,vy+26,vx+89,vy+110,0,-14);
box_full(vx+6,vy+96,vx+89,vy+110,4,4,0);
sprint(sub_name(name_p[j],att_p[j]),
vx+12,vy+109,15,8,12,12,0);
break;
}
}
MOS_setControl(k);
MOS_disp(1);
}
}
void dsp_dir()
{
setmos(82);
if (ch_dir(".") == 0) { setdir(); }
no = 0;
dsp_name(0);
setmos(81);
}
void ch_drive(int vector)
{
int vx,vy;
unsigned n_drive, c_drive, drives;
key_buff_clear();
_dos_getdrive(&n_drive);
do
{
n_drive += vector;
if (n_drive< 1) { n_drive = 26; }
if (n_drive>26) { n_drive = 1; }
_dos_setdrive(n_drive,&drives);
_dos_getdrive(&c_drive);
}
while(c_drive != n_drive);
dsp_drive();
vx = win[active].wx;
vy = win[active].wy;
EGB_paintMode(egb_work,0x22);
box_full(vx+6,vy+26,vx+89,vy+110,4,4,0);
file_end = 0;
}
void file() /* file window が押された */
{
int p;
p = win[active].last->number;
if (p<file_end)
{
if ((att_p[sort_p[p+no]] & 0x10) != 0)
{
if (ch_dir(name_p[sort_p[p+no]]) == 0)
{ setdir(); }
no = 0;
dsp_name(0);
}
else
{
key_buff_clear();
cursor_dsp(0);
strcpy(key_buff, name_p[sort_p[p+no]]);
key_cursor += strlen(key_buff);
sprint(key_buff,key_x+1,key_y+13,15,0,12,12,0);
cursor_dsp(1);
}
}
}
void f_up() /* "▲" が押された */
{
no--;
if (no<0) { no = 0; }
else { dsp_name(1); }
}
void f_down() /* "▼" が押された */
{
no++;
if (no>file_end-6)
{
no = file_end-6;
if (file_end<6) { no = 0; }
}
else { dsp_name(2); }
}
void d_sub() /* "≪" が押された */
{
ch_drive(-1);
}
void d_add() /* "≫" が押された */
{
ch_drive(1);
}
void file_sel(int mode)
{
int i;
char *str;
BUTTON *p;
if (mode != 3) { close(); }
p = window_open(220,180,199,119,390,97);
for (i=0 ; i<6 ; i++)
{
p = create(p,6,i*14+27,83,12,1,file);
}
p = create(p, 94, 25,11,11,2,f_up);
p = create(p, 94,100,11,11,2,f_down);
p = create(p,126, 25,11,23,0,d_sub);
p = create(p,139, 25,23,23,0,dsp_dir);
p = create(p,164, 25,11,23,0,d_add);
switch(mode)
{
case 0:
{
p = create(p,126, 94,32,17,0,data_load_check);
str = "読み込み"; break;
}
case 1:
{
p = create(p,126, 94,32,17,0,data_save_check);
str = " 保存 "; break;
}
case 2:
{
p = create(p,126, 94,32,17,0,picture_load);
str = " 画像 "; break;
}
case 3:
{
p = create(p,126, 94,32,17,0,sound_name);
str = " 効果音 "; break;
}
}
p = create(p,163, 94,31,17,0,close);
sprint(str,348,245,15,8,12,12,8);
key_start(win[active].wx+113,win[active].wy+72,12);
dsp_drive();
dsp_dir();
}